package com.enroban.dr.util;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

import javax.sql.rowset.spi.XmlWriter;
import java.io.*;
import java.util.List;

public class XmlUtil {
    /**
     * 读取并替换xml文件中的内容
     * @param xml xml文件
     * @param key ${abc}这样的特殊值
     * @param value 替换的值
     * @throws DocumentException
     */
    public static void readAndReplace(String xml,String key,String value) throws DocumentException, IOException {
        //1.将xml文件加载到内存中
        SAXReader saxReader = new SAXReader();
        //document 加载执行xml文档获取Document对象
        Document document = saxReader.read(xml);
        //2.获取根元素的对象 -- books getRootElement 获取根元素
        Element rootElement = document.getRootElement();

        getNodes(rootElement,key,value);

        OutputFormat outputFormat = new OutputFormat();
        outputFormat.setEncoding("UTF-8");

        OutputStream outputStream = new FileOutputStream(xml);
        XMLWriter xmlWriter = new XMLWriter(outputStream,outputFormat);

        xmlWriter.write(document);
        xmlWriter.close();

    }

    public static void getNodes(Element node,String key,String value){
//        System.out.println("--------------------");

        //当前节点的名称、文本内容和属性
//        System.out.println("当前节点名称："+node.getName());//当前节点名称
//        System.out.println("当前节点的内容："+node.getTextTrim());//当前节点名称
        if(node.getTextTrim().equals(key)){
//            System.out.println("找到符合的key:"+node.getTextTrim()+":并替换:"+value);
            node.setText(node.getTextTrim().replace(key,value));
        }
        List<Attribute> listAttr=node.attributes();//当前节点的所有属性的list
        for(Attribute attr:listAttr){//遍历当前节点的所有属性
//            String name=attr.getName();//属性名称
//            String value2=attr.getValue();//属性的值
//            System.out.println("属性名称："+attr.getName()+"属性值："+attr.getValue());
        }

        //递归遍历当前节点所有的子节点
        List<Element> listElement=node.elements();//所有一级子节点的list
        for(Element e:listElement){//遍历所有一级子节点
            getNodes(e,key,value);//递归
        }
    }


}
